\section{Persistance des données}

Conserver des données en dehors des fonctions est souvent nécessaire (par exemple conserver les caractéristiques d'une scène 3D). Celà peut être géré de deux façon différentes.

\subsection{La super-affectation}
La super-affectation est la méthode pour affecter des variables 
globales en R. Cela passe par l'opérateur $<<-$ qui s'utilise 
de la façon suivate : 

\begin{lstlisting}
> x <<- c(5,5,5)
\end{lstlisting}

Ce morceau de code signifie que la variable x, contenant un vecteur de 
taille 3 sera connu de n'importe quel environnement. On pourra y accéder
dans la console, dans des scripts, dans un package ; et celà reste vrai
quel que soit l'endroit où a été affecté x.
\paragraph{}
 Cette méthode est très facile à mettre en place et peu contraignante en terme de code. Elle est adaptée aux scripts en dehors des packages et aux implémentations rapides. Cependant, comme dans n'importe quel autre langage de programmation une variable globale est dangereuse pour la
stabilité du code. En effet elle peut être accidentellement écrasée par une variable locale du même nom.


\subsection{Les environnements}
\paragraph{}
Afin de protéger les données critiques mais de les rendre tout de même accessibles, R permet de définir des environnements. Les environnements sont des pools de variables. Ils peuvent être protégés à l'intérieur d'un package (C.A.D. innaccessible depuis l'extérieur). Cependant, leur mise en place est un peu plus complexe. Elle se fait en plusieurs étapes : 
\begin{itemize}
\item Déclarer un nouvel environnement :
\begin{lstlisting}
> environnement <- new.env()
\end{lstlisting}
\item Ajouter des variables :
\begin{lstlisting}
> environnement$variable <- valeur
\end{lstlisting}
\item Utiliser les variables contenues dans l'environnement : 
\begin{lstlisting}
> variableLocale <- environnement$variable
\end{lstlisting}
\end{itemize}
\paragraph{}
De plus la déclaration de l'environnement doit se faire à un niveau supérieur que les éléments qui devront le connaitre. Exemple : 
\begin{lstlisting}
e1 <- new.env()

f <- function() {
  e2 <- new.env()
  g <- function() {
    e3 <- new.env()
  }
}

h <- function() {}
\end{lstlisting}

\paragraph{}
L'environnement $e1$ sera connu des fonctions $f$, $g$ et $h$, $e2$ ne sera connu que de $f$ et $g$. Enfin, $e3$ ne sera connu que de $g$.
\paragraph{}
Les environnements sont plus complexes à mettre en place que les super-affectations, cependant, ils permettent une encapsulation et une
protection des données internes à un package. Ils sont moins adaptés à l'utilisation dans un script ou en ligne de commande.
